package utils

import (
	"context"
	"server/global"
	"server/model/other"

	"github.com/elastic/go-elasticsearch/v8/typedapi/types"
)

// MySQLPagination 实现 MySQL 数据分页查询
func MySQLPagination[T any](model *T, option other.MySQLOption) (list []T, total int64, err error) {
	// 默认分页为1
	if option.Page < 1 {
		option.Page = 1
	}
	// 默认每页大小为10
	if option.PageSize < 1 {
		option.PageSize = 10
	}
	// 默认为id 降序排列
	if option.Order == "" {
		option.Order = "id desc"
	}
	query := global.DB.Model(model)

	// 额外的where条件
	if option.Where != nil {
		query = query.Where(option.Where)
	}

	if err = query.Count(&total).Error; err != nil {
		return nil, 0, err
	}

	// 预加载关联模型
	for _, preload := range option.Preload {
		query = query.Preload(preload) // 应用预加载的关联查询
	}
	// 应用分页查询
	err = query.Order(option.Order).
		Limit(option.PageSize).                      // 设置每页记录数
		Offset((option.Page - 1) * option.PageSize). // 设置偏移量，根据页码计算
		Find(&list).Error                            // 执行查询，并将结果存入 list 中

	return list, total, err
}

func EsPagination(ctx context.Context, option other.EsOption) (list []types.Hit, total int64, err error) {
	if option.Page < 1 {
		option.Page = 1
	}
	if option.PageSize < 1 {
		option.PageSize = 10
	}
	// 设置elasticsearch的查询分页值
	form := (option.Page - 1) * option.PageSize // 从那一条记录开始
	option.Request.Size = &option.PageSize      // 设置每页记录大小
	option.Request.From = &form                 // 设置其实记录位置

	// elasticsearch 的搜索查询
	res, err := global.ESClient.Search().Index(option.Index).Request(option.Request).SourceIncludes_(option.SourceIncludes...).Do(ctx)
	if err != nil {
		return nil, 0, err
	}

	list = res.Hits.Hits
	total = res.Hits.Total.Value
	return list, total, nil
}
